<?php
	/**
	  * @package	MyTools
	  * @name		FileChecker
	  * @brief		Clase para realizar verificaciones comunes sobre ficheros (existe?, se puede leer?, etc..)
	  * @author		Hermann D. Schimpf <hschimpf@gschimpf.com>
	  * @license	http://opensource.org/licenses/gpl-2.0.php
	  * @date		2009-12-22
	  * @version	0.1.0
  	**/

	final class FileChecker extends MyDebuger implements MyVersions {
		/* version de la clase */
		private static $version			= 0;
		/* subversion de la clase */
		private static $subversion		= 1;
		/* numero de revision de la clase */
		private static $revision		= 0;

		/* fichero a verificar */
		private $fileName		= Null;

		public function __construct($debug = False) {
			/* creamos el padre */
			parent::__construct($debug, __CLASS__);
		}

		public static final function getVersion() {
			/* retornamos la version actual de la clase */
			return 'v' . self::$version . '.' . self::$subversion . '.' . self::$revision;
		}

		public static function checkFile($fileName = Null, $withWritable = False, $debug = False) {
			/* ingresamos a un control de errores para capturar mis excepciones */
			try {
				/* ingresamos a un control de errores para capturar las excepciones de ejecucion */
				try {
					/* creamos una instancia */
					$checkFile = new FileChekcer($debug);
					/* almacenamos el nombre del fichero */
					$checkFile->saveFileName($fileName);
					/* ejecutamos el checkeo */
					$checkFile->runCheck($withWritable);
					/* si todo fue bien retornamos True */
					return True;
				/* capturamos las excepciones */
				} catch (Exception $e) {
					/* capturamos todos los errores y los transformamos en mi excepcion */
					$this->convertToMyException($e);
				}
			/* capturamos mis excepciones */
			} catch (MyException $e) {
				/* si se produjo una excepcion la manejamos con el metodo 'show' */
				$this->show($e->getMensaje());
			}
		}

		private function saveFileName($fileName = Null) {
			/* almacenamos el nombre del fichero */
			$this->fileName = $fileName;
		}

		private function getFileName() {
			/* retornamos el nombre del fichero */
			return $this->fileName;
		}

		private function runCheck($withWritable) {
			/* verificamos si especifico un nombre de fichero */
			$this->checkName();
			/* verificamos si el fichero existe */
			$this->checkFileExists();
			/* verificamos si podemos leer el fichero */
			$this->checkFileReadable();
			/* verificamos si tambien debemos poder escribir */
			if ($withWritable === True)
				/* verificamos si podemos escribir en el fichero */
				$this->checkFileWritable();
		}

		private function checkName() {
			/* verificamos si el nombre esta vacio */
			if ($this->getFileName() === Null)
				/* salimos con una excepcion */
				$this->newException('No se especifico el nombre del fichero a verificar');
		}

		private function checkFileExists() {
			/* verificamos si el fichero existe */
			if (!file_exists($this->getFileName()))
				/* salimos con una excepcion */
				$this->newException('El fichero no existe');
		}

		private function checkFileReadable() {
			/* verificamos si el fichero existe */
			if (!is_readable($this->getFileName()))
				/* salimos con una excepcion */
				$this->newException('El fichero no se puede leer');
		}

		private function checkFileWritable() {
			/* verificamos si el fichero existe */
			if (!is_writable($this->getFileName()))
				/* salimos con una excepcion */
				$this->newException('El fichero no se puede modificar');
		}
	}
?>